Transfer Learning হল একটি মেশিন লার্নিং কৌশল, যেখানে একটি প্রাক-প্রশিক্ষিত মডেল (pre-trained model) থেকে শেখা জ্ঞানের কিছু অংশকে নতুন এবং সাধারণত ছোট ডেটাসেটে প্রয়োগ করা হয়। সাধারণত, একটি প্রাক-প্রশিক্ষিত মডেল বৃহৎ ডেটাসেটে প্রশিক্ষিত থাকে, যেমন ImageNet, এবং তারপর সেই মডেলটি Custom Dataset-এর উপর পুনরায় প্রশিক্ষণ (fine-tuning) করা হয়।
এটি ডিপ লার্নিংয়ে বিশেষভাবে জনপ্রিয়, কারণ এটি আপনার ছোট ডেটাসেটের জন্য ভাল পারফরম্যান্স অর্জন করতে সহায়ক, যখন আপনার কাছে পর্যাপ্ত পরিমাণ ডেটা না থাকে। Transfer Learning আপনাকে কম্পিউটেশনাল খরচ কমাতে এবং দ্রুত মডেল প্রশিক্ষণ করতে সাহায্য করে।
Transfer Learning এর মূল পদক্ষেপ
- Pre-trained Model নির্বাচন করা: সাধারণত, ImageNet বা অন্য কোনো বড় ডেটাসেটে প্রশিক্ষিত মডেল নির্বাচন করা হয়।
- Custom Dataset এর জন্য মডেল কাস্টমাইজ করা: আপনার ডেটাসেটের জন্য আউটপুট লেয়ার পরিবর্তন করা হয় এবং প্রয়োজনীয় ফিচার শিখতে প্রশিক্ষণ দেয়া হয়।
- Fine-tuning: প্রাক-প্রশিক্ষিত মডেলের কিছু লেয়ার "freeze" করা হয় এবং কিছু লেয়ার প্রশিক্ষণ করা হয়।
ধাপ ১: Pre-trained Model নির্বাচন এবং Custom Dataset এর জন্য কাস্টমাইজ করা
আমরা MXNet এবং GluonCV ব্যবহার করে Transfer Learning করবেন। এখানে একটি সাধারণ Convolutional Neural Network (CNN) মডেল, যেমন ResNet-50 বা VGG16 ব্যবহার করা হবে, যা ImageNet ডেটাসেটের উপর প্রশিক্ষিত।
ধরা যাক, আপনার কাছে একটি কাস্টম ডেটাসেট আছে, যেমন cats vs dogs। আমরা এই ডেটাসেটের জন্য pre-trained model ব্যবহার করব।
1.1 Pre-trained Model লোড করা
GluonCV লাইব্রেরি থেকে একটি pre-trained মডেল যেমন ResNet-50 ব্যবহার করা:
import mxnet as mx
from mxnet.gluon import model_zoo, nn
from mxnet import init
# Pre-trained model লোড করুন (ResNet-50 ImageNet এর উপর প্রশিক্ষিত)
model = model_zoo.vision.resnet50_v2(pretrained=True)
# আউটপুট লেয়ার পরিবর্তন করুন (যেহেতু আমাদের কাস্টম ডেটাসেট 2 ক্লাসে বিভক্ত)
model.output = nn.Dense(2) # 2 ক্লাস (cats, dogs)
# মডেল ইনিশিয়ালাইজ করুন
model.initialize(init.Xavier(), ctx=mx.gpu())
এখানে আমরা ResNet-50 মডেল ব্যবহার করেছি এবং তার আউটপুট লেয়ারটি 2 ক্লাস (cats এবং dogs) কাস্টম ডেটাসেটের জন্য পরিবর্তন করেছি।
ধাপ ২: Custom Dataset তৈরি
এখন আমাদের Custom Dataset তৈরি করতে হবে। ধরুন আমাদের কাছে cats vs dogs নামে একটি ডেটাসেট রয়েছে, যেখানে ছবির দুটি শ্রেণি আছে: কুকুর এবং বিড়াল।
2.1 Custom Dataset লোড করা
from mxnet.gluon.data.vision import ImageFolderDataset
from mxnet.gluon.data import DataLoader
from mxnet.gluon.data.vision import transforms
# ট্রেনিং এবং টেস্ট ডেটার জন্য ডেটাসেট লোড করুন
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
train_dataset = ImageFolderDataset('data/train', transform=transform)
test_dataset = ImageFolderDataset('data/test', transform=transform)
# DataLoader তৈরি করুন
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
এখানে:
- ImageFolderDataset ব্যবহার করে ডেটা লোড করা হয়েছে।
- transform ব্যবহার করে প্রতিটি ইমেজের আকার 256x256 এ রিসাইজ করা হয়েছে, তারপর CenterCrop করে 224x224 আকারে আউটপুট ইমেজ প্রস্তুত করা হয়েছে। এরপর Normalization করা হয়েছে।
ধাপ ৩: Transfer Learning এবং Fine-tuning
এখন আমাদের প্রাক-প্রশিক্ষিত মডেলটি fine-tune করতে হবে, যার মাধ্যমে আমরা কাস্টম ডেটাসেটের জন্য মডেলটিকে আরও ভালভাবে প্রশিক্ষণ দেব।
3.1 Fine-tuning
from mxnet import autograd
from mxnet.gluon import loss as gloss, Trainer
# ক্ষতি ফাংশন এবং ট্রেনার সেটআপ
loss_fn = gloss.SoftmaxCrossEntropyLoss()
trainer = Trainer(model.collect_params(), 'adam', {'learning_rate': 0.001})
# Fine-tuning প্রক্রিয়া
epochs = 10
for epoch in range(epochs):
total_loss = 0
for data, label in train_loader:
with autograd.record():
output = model(data)
loss = loss_fn(output, label)
loss.backward()
trainer.step(data.shape[0])
total_loss += loss.mean().asscalar()
print(f"Epoch {epoch + 1}, Loss: {total_loss / len(train_loader)}")
এখানে:
- SoftmaxCrossEntropyLoss ব্যবহার করা হয়েছে লস (loss) হিসাব করার জন্য।
- Trainer ব্যবহার করে Adam অপটিমাইজার দিয়ে প্রশিক্ষণ দেয়া হয়েছে।
autograd.record()দিয়ে গ্র্যাডিয়েন্ট হিসাব করা হচ্ছে, এবংtrainer.step()দিয়ে প্যারামিটার আপডেট করা হচ্ছে।
ধাপ ৪: মডেল মূল্যায়ন
ফাইন টিউনিংয়ের পর, আমরা মডেলটি টেস্ট ডেটাসেটের উপর মূল্যায়ন করব।
# মডেল মূল্যায়ন
correct = 0
total = 0
for data, label in test_loader:
output = model(data)
predictions = mx.nd.argmax(output, axis=1)
correct += (predictions == label).sum().asscalar()
total += label.shape[0]
accuracy = correct / total
print(f"Test Accuracy: {accuracy * 100:.2f}%")
এখানে:
- argmax() ব্যবহার করে আউটপুট থেকে শ্রেণি নির্বাচন করা হয়েছে।
- সঠিক প্রেডিকশন গুলি গণনা করে টেস্ট অ্যাকিউরেসি বের করা হয়েছে।
ধাপ ৫: মডেল সংরক্ষণ এবং পুনঃলোড
প্রশিক্ষিত মডেল সংরক্ষণ করা:
model.save_parameters('cats_vs_dogs_model.params')
মডেল পুনঃলোড করার জন্য:
model.load_parameters('cats_vs_dogs_model.params')
সারাংশ
Transfer Learning একটি শক্তিশালী কৌশল, যা মডেলের শেখার সময় কাটিয়ে আরও দ্রুত এবং কার্যকরী ফলাফল অর্জন করতে সাহায্য করে। এখানে আমরা MXNet এর মাধ্যমে Pre-trained Model (যেমন ResNet-50) ব্যবহার করে fine-tuning করার পদ্ধতি দেখেছি, এবং Custom Dataset (Cats vs Dogs) এর জন্য মডেল তৈরি ও প্রশিক্ষণ করেছি।
এই প্রক্রিয়ায়:
- Pre-trained Model থেকে শেখা জ্ঞান ব্যবহার করা হয়েছে।
- Custom Dataset এর জন্য মডেল কাস্টমাইজ করা হয়েছে এবং প্রশিক্ষণ দেয়া হয়েছে।
- Fine-tuning এবং model evaluation করে মডেলটি টেস্ট করা হয়েছে।
Read more